package com.lagou.handler;

import com.alibaba.fastjson.JSONObject;
import com.lagou.pojo.RpcRequest;
import com.lagou.service.IUserService;
import com.lagou.service.UserServiceImpl;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.concurrent.EventExecutorGroup;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 自定义的业务处理器
 */
public class UserServiceHandler extends ChannelInboundHandlerAdapter {

    //当客户端读取数据时,该方法会被调用
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //注意:  客户端将来发送请求的时候会传递一个参数:  UserService#sayHello#are you ok
         //1.判断当前的请求是否符合规则  使用fastjson对对象进行转换
        RpcRequest rpcRequest=JSONObject.parseObject((String) msg, RpcRequest.class);
        if("com.lagou.service.IUserService".equals(rpcRequest.getClassName()) && "rpcRequestService".equals(rpcRequest.getMethodName())){
            //2.如果符合规则,使用反射技术，拿到class对象
            Class<?> aClass = Class.forName(rpcRequest.getClassName());
            //3.使用动态代理技术，处理该方法的业务逻辑
            IUserService proxy = (IUserService)getProxy(aClass, rpcRequest);
            String result = proxy.rpcRequestService(rpcRequest);
            //3.把调用实现类的方法获得的结果写到客户端
            ctx.writeAndFlush(result);
        }
    }

    public static    <T> T getProxy(Class<?> aClass,final RpcRequest rpcRequest){
        return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{aClass}, new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //目前我们只针对rpcRequestService方法进行动态代理处理
                String name = method.getName();
                if("rpcRequestService".equals(name)){
                    //开始对客户端传过来的数据，进行业务处理，此处仅仅是打印一下
                    System.out.println("使用动态代理的方法，对客户端的交互请求进行处理开始---");
                    System.out.println("接收到来自客户端的字符串:"+rpcRequest.getParameters()[0]);
                    System.out.println("使用动态代理的方法，对客户端的交互请求进行处理完毕---");

                    return "success";
                }
                return null;
            }
        });
    }
}
